﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.ActiveRecord;
using Castle.Components.Validator;

namespace Matriculex.Dominio
{
    [ActiveRecord("curso"), JoinedBase, Serializable]
    public abstract class Curso : RemovableEntityWithId<Curso>
    {
        // construtor vazio necessário para o ActiveRecord
        protected Curso() { }

        public Curso(string nome, string código, int NumeroCiclos)
        {
            this.Nome = nome;
            this.Código = código;
            this.NumeroCiclos = NumeroCiclos;
        }

        [Property]
        [ValidateNonEmpty("Nome do Curso não pode ser vazio.")]
        public string Nome { get; set; }
        
        [Property]
        [ValidateNonEmpty("Código do Curso não pode ser vazio.")]
        public string Código { get; set; }

        [Property]
        public int NumeroCiclos { get; set; }

        public abstract IList<Aluno> GetAlunos();

        public override string ToString()
        {
            return Código + " - " + Nome;
        }

        public override void Save()
        {
            Curso[] cursos = FindAllByProperty("Código", this.Código);
            // se é um novo curso
            if (this.IsTransient())
            {
                if (cursos != null && cursos.Length > 0)
                    throw new DominioException("Já existe um curso com este código");
            }
            else
            {
                // se vamos salvar
                if (cursos != null && cursos.Length > 0)
                {
                    // se há mais de 1 curso com este código (inconsistencia)
                    // ou o Id do curso de código existen não é este
                    if(cursos.Length > 1 || cursos[0].Id != this.Id)
                        throw new DominioException("Já existe um curso com este código");
                }
            }

            base.Save();
        }

    }
}
